package logica;

import nivel.*;

/**
 * Clase que modela la logica de los movimientos. Se encarga de
 * reportar si se puede realizar un movimiento o no.
 * 
 * @author Agustin Orge (LU.85538)
 * @author Victoria Martinez de la Cruz (LU.87620)
 */
public class Logica {

	// Consultas

	/**
	 * Retorna si se puede mover a la posicion (x,y)
	 * 
	 * @param x
	 *            posicion en el eje x
	 * @param y
	 *            posicion en el eje y
	 * @return true, si puede mover
	 */
	protected boolean puedeMover(int x, int y,EntidadConLogica e) {

		Casillero ca = e.getNivel().getTablero().buscarCasillero(x, y);

		if (ca == null) { // no existe el casillero, se puede mover
			return true;
		} else { // existe el casillero, reacciona el obstaculo
			if(ca.getObstaculo()!= null){
			return ca.getObstaculo().reaccionar();
			}else{
				return true;
			}
		}
	}

	/**
	 * Reporta si se puede caer a la posicion (x,y). La busca en el tablero.
	 * 
	 * @param x
	 *            posicion en el eje x
	 * @param y
	 *            posicion en el eje y
	 * @return true, si puede caer
	 */
	private boolean puedeCaer(int x, int y,EntidadConLogica e) {

		Casillero ca = e.getNivel().getTablero().buscarCasillero(x, y);
		boolean retorno;

		if (ca == null) {
			return true;
		} else { // hay casillero, entonces reacciona con el obstaculo
			if(ca.getObstaculo()!= null){
				retorno = ca.getObstaculo().reaccionar();
				}else{
					retorno = true;
				}
		}
		return retorno;
	}


	/**
	 * Reporta si puede caer desde la posicion en la que se encuentra.
	 * 
	 * 
	 * 
	 * @return true, si puede caer
	 */
	public boolean caer(EntidadConLogica e) {

		

			boolean abajo, abajoIzq, abajoDer;

			abajo = puedeCaer(e.getCasilleroActual().getX(), e
					.getCasilleroActual().getY() + 16, e);
			abajoIzq = puedeCaer(e.getCasilleroActual().getX() - 8, e
					.getCasilleroActual().getY() + 16, e);
			abajoDer = puedeCaer(e.getCasilleroActual().getX() + 8, e
					.getCasilleroActual().getY() + 16, e);

			return (abajoIzq && abajoDer && abajo);
			
		
	}

	/**
	 * Reporta si puede saltar desde la posicion en la que se encuentra.
	 * 
	 * @return true, si puede saltar
	 */
	public boolean saltar(EntidadConLogica e) {

		return false;

	}

	/**
	 * Reporta si se puede mover a la derecha desde la posicion en la que se
	 * encuentra.
	 * 
	 * @return true, si se puede mover a la derecha
	 */
	public boolean moverDerecha(EntidadConLogica e) {
		boolean derecha, derechaArriba, derechaAbajo;

		derecha = puedeMover(e.getCasilleroActual().getX() + 16, e
				.getCasilleroActual().getY(), e);
		derechaArriba = puedeMover(e.getCasilleroActual().getX() + 16,
				e.getCasilleroActual().getY() - 8, e);
		derechaAbajo = puedeMover(e.getCasilleroActual().getX() + 16, e
				.getCasilleroActual().getY() + 8, e);

		return (derecha && derechaArriba && derechaAbajo);
	}

	/**
	 * Reporta si se puede mover a la izquierda desde la posicion en la que se
	 * encuentra.
	 * 
	 * @return true, si se puede mover a la izquierda
	 */
	public boolean moverIzquierda(EntidadConLogica e) {
		boolean izquierda, izquierdaArriba, izquierdaAbajo;

		// si mario esta en el inicio del mapa, no puede moverse hacia la
		// izquierda

		if (e.getCasilleroActual().getX() == 336) {
			return false;
		} else {

			izquierda = puedeMover(e.getCasilleroActual().getX() - 16,
					e.getCasilleroActual().getY(), e);
			izquierdaArriba = puedeMover(
					e.getCasilleroActual().getX() - 16, e
							.getCasilleroActual().getY() - 8, e);
			izquierdaAbajo = puedeMover(e.getCasilleroActual().getX() - 16,
					e.getCasilleroActual().getY() + 8, e);

			return (izquierda && izquierdaAbajo && izquierdaArriba);
		}

	}

	
	

	

}
